/* BasicFile.h
 * 
 *  Author          : Alexander J. Yee
 *  Date Created    : 12/30/2015
 *  Last Modified   : 12/30/2015
 * 
 *      std::string paths are assumed to be UTF-8.
 * 
 */

#pragma once
#ifndef ymp_FileIO_BasicFile_H
#define ymp_FileIO_BasicFile_H
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Dependencies
#include "PublicLibs/CompilerSettings.h"
#if _WIN32
#include "BaseFile/BaseFile_Windows.h"
#else
#include "BaseFile/BaseFile_Default.h"
#endif
namespace ymp{
namespace FileIO{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
class BasicFile : public BaseFile{
public:
    BasicFile() = default;

    //  Open for read only.
    BasicFile(const std::string& path, bool retry = false);
    BasicFile(const char* path, bool retry = false)
        : BasicFile(std::string(path), retry)
    {}

    //  Create for read + write.
    BasicFile(ufL_t bytes, const std::string& path, bool retry = false);
    BasicFile(ufL_t bytes, const char* path, bool retry = false)
        : BasicFile(bytes, std::string(path), retry)
    {}

public:
    using BaseFile::read;
    using BaseFile::write;
    template <typename ctype> bool write(const std::basic_string<ctype>& str);
};
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Templates
template <typename ctype>
bool BasicFile::write(const std::basic_string<ctype>& str){
    upL_t bytes = str.size() * sizeof(ctype);
    return write(str.c_str(), bytes) == bytes;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
}
#endif
